
package Control;

import Model.Animal;
import Utilitaria.ConexaoBanco;
import View.limAnimal;
import java.sql.Date;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Vector;
import javax.swing.JPanel;

public class ctrAnimal {
    private ctrPrincipal controlPrincipal;
    private final ConexaoBanco objConexao;
    private final limAnimal objLimite;
    private final Vector vetAnimal = new Vector();

    public ctrAnimal(ConexaoBanco objConexao) throws SQLException, Exception {
        this.objConexao = objConexao;         
        objLimite = new limAnimal(this);
    }

    public JPanel geraInterface () {
        return objLimite.geraInterface();
    }

    public int cadastraAnimal(int codCliente) throws Exception {

        int codAnimal;
        try {
            codAnimal = this.ultimoCodigo() + 1;
            Animal obj = this.montaObjetoAnimal(codCliente, codAnimal, objLimite.capturaDados());
            this.executaInsert(obj);
            this.recuperaAnimais(codCliente);
            return 1; //Confirmar sucesso
        }catch (Exception erro) {
            throw new Exception ();
        }
    }

    private Animal montaObjetoAnimal(int codCliente, int codAnimal, ArrayList<String> result) {
        //Tratar a data
        Date dt = null;
        if(!result.get(7).equalsIgnoreCase("")){
            dt = new Date(Integer.parseInt(result.get(7)), //Ano
                          Integer.parseInt(result.get(8)), //Mes
                          Integer.parseInt(result.get(9)));//Dia
        }
        Animal obj = new Animal( codCliente, codAnimal,
                                result.get(0), //nome
                                result.get(1), //apelido
                                result.get(2), //especie
                                result.get(3), //raca
                                result.get(4), //porte
                                result.get(5), //observacoes
                                result.get(6), //foto
                                dt); //dtNasc
        return obj;
    }

    private void executaInsert(Animal obj) throws SQLException {
        String sqlAnimal = null;
        try{
            if(!obj.getFoto().equalsIgnoreCase("")) //Corrige o caminho da imagem
                obj.setFoto(obj.getFoto().replace("\\", "/"));
            if(obj.getDtNasc() == null) { //Nesse laço foi removido as aspas simples ao redor da dtNasc para que o banco entenda que a mesma eh null
                sqlAnimal = "insert into tbl_animal values (" +
                        obj.getCodAnimal()+ ", " +
                        obj.getCodCliente() + ", '" +
                        obj.getNome() + "', '" +
                        obj.getApelido() + "', '" +
                        obj.getEspecie() + "', '" +
                        obj.getRaca() + "', '" +
                        obj.getPorte() + "', '" +
                        obj.getObservacoes()  + "', '" +
                        obj.getFoto() + "', " +
                        obj.getDtNasc() +")";
            }
            else {
                sqlAnimal = "insert into tbl_animal values (" +
                        obj.getCodAnimal()+ ", " +
                        obj.getCodCliente() + ", '" +
                        obj.getNome() + "', '" +
                        obj.getApelido() + "', '" +
                        obj.getEspecie() + "', '" +
                        obj.getRaca() + "', '" +
                        obj.getPorte() + "', '" +
                        obj.getObservacoes()  + "', '" +
                        obj.getFoto() + "', '" +
                        obj.getDtNasc() +"')";
            }
            objConexao.statement.executeUpdate(sqlAnimal);
        }catch (SQLException erro){
            System.out.println("Erro no executaInsert da ctrAnimal \nErro: "+erro.getMessage());
            throw new SQLException();
        }
    }

    public int alteraAnimal (int codCliente) throws SQLException {
        
        int index = 0;
        int aux = 0;
        int codAnimal = Integer.parseInt(objLimite.getCodAnimal());
        Animal objAlterado = this.montaObjetoAnimal(codCliente, codAnimal, objLimite.capturaDados());
        do {
            Animal obj = (Animal) vetAnimal.elementAt(index);
            if(obj.getCodAnimal() == codAnimal) {
                String sqlAnimal;
                if(!obj.getFoto().equalsIgnoreCase(objAlterado.getFoto()))
                    objAlterado.setFoto(objAlterado.getFoto().replace("\\", "/"));
                if(objAlterado.getDtNasc() == null) {
                    sqlAnimal ="UPDATE tbl_animal SET "+
                                    "ani_nome = '"+ objAlterado.getNome() +"', "+
                                    "ani_apelido = '"+ objAlterado.getApelido() +"', "+
                                    "ani_especie = '"+ objAlterado.getEspecie() +"', "+
                                    "ani_raca = '"+ objAlterado.getRaca() +"', "+
                                    "ani_porte = '"+ objAlterado.getPorte() +"', "+
                                    "ani_obs = '"+ objAlterado.getObservacoes() +"', "+
                                    "ani_foto = '"+ objAlterado.getFoto() +"', "+
                                    "ani_dtNasc = "+ objAlterado.getDtNasc() +" "+
                                    "where ani_id = "+ codAnimal;
                }
                else {
                    System.out.println("Entra no else");
                    sqlAnimal ="UPDATE tbl_animal SET "+
                                    "ani_nome = '"+ objAlterado.getNome() +"', "+
                                    "ani_apelido = '"+ objAlterado.getApelido() +"', "+
                                    "ani_especie = '"+ objAlterado.getEspecie() +"', "+
                                    "ani_raca = '"+ objAlterado.getRaca() +"', "+
                                    "ani_porte = '"+ objAlterado.getPorte() +"', "+
                                    "ani_obs = '"+ objAlterado.getObservacoes() +"', "+
                                    "ani_foto = '"+ objAlterado.getFoto() +"', "+
                                    "ani_dtNasc = '"+ objAlterado.getDtNasc() +"' "+
                                    "where ani_id = "+ codAnimal;
                }
                if (objConexao.statement.executeUpdate(sqlAnimal) == 1)
                    aux = 1;
                else
                    throw new SQLException("");
                }
            index++;
        } while (aux == 0 && index <= vetAnimal.size());
        this.recuperaAnimais(codCliente);
        return 1; //Confirmar sucesso
    }

    private int ultimoCodigo() throws SQLException {
        int last = 0;
        objConexao.executeQuery("SELECT MAX(ani_id) FROM tbl_animal");
        if (objConexao.resultset.last())
            last = objConexao.resultset.getInt("MAX(ani_id)");
        return last;
    }

    private void recuperaAnimais(int codCliente) {
        vetAnimal.clear();
        objConexao.executeQuery("SELECT * FROM tbl_animal Where ani_cli_id = " + codCliente);
        Animal objAnimal;
        try {
            while (objConexao.resultset.next()) {
                objAnimal = new Animal(Integer.parseInt(objConexao.resultset.getString("ani_cli_id")),
                                        Integer.parseInt(objConexao.resultset.getString("ani_id")),
                                        objConexao.resultset.getString("ani_nome"),
                                        objConexao.resultset.getString("ani_apelido"),
                                        objConexao.resultset.getString("ani_especie"),
                                        objConexao.resultset.getString("ani_raca"),
                                        objConexao.resultset.getString("ani_porte"),
                                        objConexao.resultset.getString("ani_obs"),
                                        objConexao.resultset.getString("ani_foto"),
                                        objConexao.resultset.getDate("ani_dtNasc"));
                vetAnimal.addElement(objAnimal);
            }
        } catch (SQLException ex) {
            System.out.println("Problemas no metodo recuperaAnimais da ctrAnimal.");
        }
    }

    public void acrescentaAnimal(ArrayList<String> result) throws SQLException, Exception {        
        Animal obj = (Animal) vetAnimal.lastElement();
        int codCliente = obj.getCodCliente();
        int codAnimal = this.ultimoCodigo() + 1;
        Animal novoAnimal = this.montaObjetoAnimal(codCliente, codAnimal, result);
        this.executaInsert(novoAnimal);
        this.recuperaAnimais(codCliente);
    }
    
    public int pesquisaAnimal (int codCliente) {
        this.recuperaAnimais(codCliente);   
        if(!vetAnimal.isEmpty()){
            Animal firstElement = (Animal) vetAnimal.firstElement();
            objLimite.setAtributos(montaResult(firstElement));
        }
        return 1; //Só para confirmar para a limCliente que a operacao deu certo
    }

    public ArrayList<String> primeiroAnimal () throws Exception {
        Animal firstElement = (Animal) vetAnimal.firstElement();
        if(firstElement != null){
            return montaResult(firstElement);
        }
        else
            throw new Exception ();
    }

    public ArrayList<String> ultimoAnimal () throws Exception {
        Animal lastElement = (Animal) vetAnimal.lastElement();
        if(lastElement != null)
            return montaResult(lastElement);
        else
            throw new Exception ();
    }

    public ArrayList<String> proximoAnimal (String strCodAnterior) throws Exception {
        Animal objBuscado = null;
        int codAnterior = Integer.parseInt(strCodAnterior);
        int aux = 0, index = 0;
        do{
            Animal objAnterior = (Animal) vetAnimal.elementAt(index);
            if(objAnterior.getCodAnimal() == codAnterior) {
                objBuscado = (Animal)vetAnimal.elementAt(index + 1);
                aux = 1;
            }
            index++;
        } while (aux == 0 && index <= vetAnimal.size());
        if (aux == 1){
            return montaResult(objBuscado);
        }else{
            throw new Exception ("");
        }
    }

    public ArrayList<String> anteriorAnimal (String strCodSucessor) throws Exception {
        Animal objSucessor = null;
        Animal objBuscado = null;
        int codSucessor = Integer.parseInt(strCodSucessor);
        int aux = 0, index = 0;
        do{
            objSucessor = (Animal) vetAnimal.elementAt(index);
            if(objSucessor.getCodAnimal() == codSucessor && index == 0)
                index = -2;
            if(objSucessor.getCodAnimal() == codSucessor){
                objBuscado = (Animal)vetAnimal.elementAt(index - 1);
                aux = 1;
            }
            index++;
        } while (aux == 0 && index != -1);
        if (aux == 1)
            return montaResult(objBuscado);
        else
            throw new Exception ("");
    }

    private ArrayList<String> montaResult (Animal obj){
        ArrayList<String> result = new ArrayList<String>();
        result.add(String.valueOf(obj.getCodAnimal()));
        result.add(obj.getNome());
        result.add(obj.getApelido());
        result.add(obj.getEspecie());
        result.add(obj.getRaca());
        result.add(obj.getPorte());
        result.add(obj.getObservacoes());
        result.add(obj.getFoto());
        Date dt = obj.getDtNasc();        
        if(dt == null) {
            result.add("");
            result.add("");
            result.add("");
        }
        else {
            result.add(String.valueOf(dt.getYear()));
            result.add(String.valueOf(dt.getMonth()));
            result.add(String.valueOf(dt.getDay()));
        }
        return result;
    }

    private String corrigeCaminhoImagem(String caminho) {
        String novoCaminho  = caminho.replace("\\", "/");
        return novoCaminho;
    }

    public int limpaAtributos() {
        vetAnimal.removeAllElements();
        objLimite.limpaFields();
        return 1; //Só para confirmar para a limCliente que a operacao deu certo
    }

    public ArrayList<String> consultaEspecies() {

        ArrayList<String> result = new ArrayList();
        String sql = "SELECT DISTINCT(ser_ani_especie) FROM tbl_servico";
        objConexao.executeQuery(sql);
        try {
            while (objConexao.resultset.next()) {
                result.add(objConexao.resultset.getString(1));
            }

        } catch (SQLException ex) {
            System.out.println("Problemas para consultar lista de especie. Erro no inicializaCombos da ctrAnimal");
        }
        return result;
    }

    public ArrayList<String> consultaPortes() {

        ArrayList<String> result = new ArrayList();
        String sql = "SELECT DISTINCT(ser_ani_porte) FROM tbl_servico";
        objConexao.executeQuery(sql);
        try {
            while (objConexao.resultset.next()) {
                result.add(objConexao.resultset.getString(1));
            }
        } catch (SQLException ex) {
            System.out.println("Problemas para consultar lista de portes. Erro no inicializaCombos da ctrAnimal");
        }
        return result;
    }

    public ArrayList<String> consultaRacas(String especie) {

        ArrayList<String> result = new ArrayList();
        String sql = "SELECT DISTINCT(ser_ani_raca) FROM tbl_servico WHERE ser_ani_especie = '" + especie + "'";
        objConexao.executeQuery(sql);
        try {
            while (objConexao.resultset.next()) {
                result.add(objConexao.resultset.getString(1));
            }
        } catch (SQLException ex) {
            System.out.println("Problemas para consultar lista de racas. Erro no inicializaCombos da ctrAnimal");
        }
        return result;        
    }

}
